package com.legendframework.core.cmd;

import com.legendframework.core.ioc.IParameter;
import org.bukkit.command.CommandSender;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @Auther: 196
 */
public interface ICommand {

     /**
      * 通一的执行成功处理器
      * 当某指令方法上被标识了@CmdSuccessHandle时，会触发该处理器
      *
      * @param sender 指令发送者
      * @param method 执行成功的指令方法
      * @param params 执行这个指令方法所传入的参数
      */
     void successHandle(CommandSender sender , Method method , Object... params);

     /**
      * 当方法执行异常的处理器，方法执行异常时触发
      *
      * @param sender 指令发送者
      * @param e 异常信息
      * @param method 执行失败的指令方法
      */
     void failHandle(CommandSender sender ,Throwable e , Method method);

     /**
      * 当指令参数的个数正确，但与方法所匹配的类型不一致时，会调用该处理器
      *
      * 例如：参数类型为int类型， 玩家输入的这个参数为 "abc" ，则会调用该处理器
      *
      * @param sender 指令发送者
      * @param e 异常信息
      * @param method 封装入参失败的指令方法
      * @param parameter 导致参数错误的这个参数，它可能是一个入参 {@link Parameter} 也可能是一个字段 {@link Field}
      * @param param 导致错误方法实参
      * @param index 参数的索引
      */
     void paramsErrorHandle(CommandSender sender , Throwable e, Method method , IParameter parameter , Object param, int index);
}